home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 July / Macworld (1999-07).dmg / Shareware World / Info / For Developers / Mops 3.4.sea / Quick Edit ƒ / Subject Glossary / Compiler < prev    next >
Text File  |  1996-01-14  |  12KB  |  285 lines

  1.  \ 14Jan96 DBH
  2. (    --
  3.     Left paren.  Denotes the beginning of a comment.  At least one 
  4.     space must follow.  End comment with a right paren ).  
  5. )    --
  6.     Right paren.  Denotes the end of a comment that was begun by ( .
  7.  
  8. \    --    Backslash.  Will cause compiler to ignore the rest of that line.
  9.  
  10. (*    ( -- )    Compiler    Base
  11.     (* ... *) defines a multi-line comment, which can be very useful.  Many
  12.     Pascal compilers use these symbols - I thought it better not to use
  13.     the C-style /* ... */  since */ already has a meaning.
  14.     A useful improvement to the typical Pascal implementation is to keep a
  15.     level count so that this kind of comment can be nested.
  16.  
  17. *)    ( -- )    Compiler    Base
  18.     See (* .
  19.  
  20. ENDLOAD      Will cause compiler to ignore the rest of the file being loaded.
  21.  
  22. VECT    cfa --  :  name
  23.     Defines an execution variable that can hold and execute the cfa 
  24.     of a Mops word.  Executing the vect name will execute the cfa.
  25.     Can use -> at runtime to change.  
  26.  
  27.  
  28. STATE    --  compile-state
  29.     This value is the compilation state of the Mops interpreter.  A non-zero 
  30.     value means that the definition of a word, method, or class is being compiled.  
  31.  
  32. CSTATE    -- b
  33.     This value is a boolean which is true while a class is being compiled.  It is 
  34.     analogous to state which is true while a colon word is being compiled.  
  35.  
  36. ?COMP    --
  37.     Prints message: "compilation only" if not compiling, that is, if state is not 
  38.     zero 
  39.     
  40. [    --
  41.     So now [ and ] do double duty.  If they follow a method selector, they cause a 
  42.     late bind as in Neon.  In any other context they turn compilation on and off.  
  43.  
  44. $    -- n
  45.     Will compile the ensuing characters in the input stream as a hex 
  46.     number.  
  47. LIT    n --
  48.     A state-smart version of LITERAL.  Corresponds to LITERAL in Fig-Forth or 
  49.     original Neon, whereas our present LITERAL is Forth-83.  
  50. LITW    n --    
  51.  
  52.  
  53.  
  54. In Neon, ' (tick) was state-smart, following Fig-Forth.  We have 
  55. now followed the Forth-83 and ANSI standards in replacing the 
  56. state-smart tick with the two state-dumb forms ' (which ticks the 
  57. next word in the input stream at run time, no matter what) and 
  58. ['] which is immediate, must be used in a definition, and 
  59. compiles a literal fetch of the cfa of the following word.  
  60.  
  61. '    -- cfa  : word        compilation only
  62. [']    -- cfa  : word        runtime only
  63.  
  64.  
  65.  
  66. .ID    ?cfa --
  67.     If addr looks like a cfa with a name, prints the name.  If it 
  68.     looks like a cfa without a name, prints "(no name)".  Otherwise 
  69.     doesn't print anything.  
  70.  
  71. XTS{    --  :  name1 name2 etc.
  72.     State-smart word to compile or stack a list of xts.  Pulls words from stream, 
  73.     until "}". 
  74.     
  75. ?#XTS    n1 n2 --
  76.     Used to check that the right number of stacked cfas is being passed in.
  77.  
  78. :    --  :  name
  79.     Creates a dictionary entry for the next word in the input stream.  
  80.     standard 
  81. ;    --    standard
  82.  
  83. For defining action handlers that cross module bounds.  If a class is defined 
  84. in module1, but instantiated in module2 with action handlers in module2, define 
  85. handlers with :a ...  ;a.  
  86. :A    --
  87. ;A    --
  88.  
  89. ,EXEC    cfa n --
  90.     State-smart execute.  If used within a program definition, compiles the cfa as 
  91.     a literal to be executed at runtime; otherwise executes it immediately.  This 
  92.     is not an immediate word.  It is useful in building compiler words which 
  93.     conditionally compile other words. 
  94.     
  95. 0,    --    Compiles an empty cell.
  96. ,    n --    Compiles 4-byte n into the next available dictionary address.
  97. C,    w --    Compiles 1-byte c into the next available dictionary address.
  98. W,    w --    Compiles 2-byte w into the next available dictionary address.
  99.  
  100. Forward    --  : name
  101.     Creates a word which is to be defined later with :f, the special colon compiler 
  102.     for forward-referenced Yerk words, because :f makes the word behave like a 
  103.     colon definition.  If you forget to define a forward-referenced word, the word 
  104.     issues the message: "Unresolved forward reference to: AWORD at address: XXXX" 
  105.     and aborts.  To forward reference an object, define a value having the same 
  106.     name as the object-to-be.  Later create the object as you would normally.  
  107.  
  108. :F    --  : name
  109.     Begins compilation of a word which was previously 
  110.     forward-referenced.  :f creates a headerless entry for the word 
  111.     and then patches the previous entry to point to the newly 
  112.     compiled definition.  Forward-referencing is useful when a word 
  113.     is to be used before it can be defined.  You end the compilation 
  114.     with ;f.
  115.     
  116. ;F    --
  117.     Ends compilation of a word which was defined with :f.  See forward.
  118.  
  119. IMMEDIATE    --    standard
  120.  
  121. INLINE{    --  : word ... }
  122.     Commences a piece of inline code.  Allows faster execution.  We assume that 
  123.     inline code chunks will be fairly short, and are to be optimized for speed.  
  124.  
  125.  
  126. EVALUATE    addr len --
  127.     ANSI standard.  Makes the passed-in string the input stream for 
  128.     interpretation or compilation, until it is exhausted. 
  129.     
  130. EX-GEN    cfa --
  131.     "Execute general".  Executes the word with the given cfa.  The word may be 
  132.     anything.  It is executed by compiling it into a temporary buffer, then 
  133.     branching there.  Slower than Execute, but unlike Execute, will really execute 
  134.     anything.  
  135.  
  136. EX-METHOD    obj cfa --
  137.     Executes the method with the given cfa, using the given object.
  138.  
  139. EXECUTE    cfa --    standard
  140.  
  141. EXN    cfa n --
  142.     is to EX-GEN what (COMPN) is to (COMP).  It has the additional parameter n 
  143.     which is action code for -> ++> etc.  Because this can be called from EX-GEN 
  144.     (which may be executing a prefix op), we use the alternate execution buffer 
  145.     ExBuf1.  
  146.  
  147. INTERPRET
  148.     is the interpretation loop.  Words from the input stream are interpreted 
  149.     until the input is exhausted.  
  150.  
  151. INTRP1    --  : word    Interprets one word/number from the input stream.
  152.  
  153. PATCHES_DONE    --
  154.     If you ever need to patch instructions, call this when you're finished.  It 
  155.     flushes the instruction cache if necessary to make sure that the new 
  156.     instructions will really be executed.  PATCH and (PATCH) call it already, so if 
  157.     you are using these, you don't need to call Patches_done.  
  158.  
  159. POSTPONE    --
  160.     In this system, compilation is done by executing the compilation handler for 
  161.     the word in question.  POSTPONE must therefore be immediate, and compile the 
  162.     right code into the client definition.  This code consists of a literal push of 
  163.     the POSTPONEd word's cfa, then a call to (COMP).  
  164.  
  165. QUIT    --    standard
  166.  
  167. TYPE{    --  :  name1 name2 etc.
  168.     TYPE{ defines a Pascal-like enumerated type.  At this stage we don't give a 
  169.     name to the "type" as such, as we can't do anything really sensible with it.  
  170.     However later we can optionally load the ENUM-TYPE class which is rather more 
  171.     Pascal-like.  But even without that, the enumeration is useful by itself.  
  172.  
  173. {    --
  174.     Used to begin list of local variables and named input parameters.  Note 
  175.     that the compiler willfirst search this list, so these names take 
  176.     precedence over other names in the dictionary.  
  177.  
  178. TRAV    cfa parm --
  179.     Traverses the dictionary, passing each cfa and the parm to the passed-in 
  180.     proc.  
  181.  
  182. TRAV-FROM    cfa parm addr --
  183.     As for TRAV, but starts from the first word whose lfa is below or at the 
  184.     given address.  
  185.  
  186. TRAVERSE    ?    
  187.  
  188. RESERVE    n --    Allots the next n bytes in the dictionary and erases them.
  189.  
  190. REVEAL    --    Makes the current name visible again. See hide.
  191.  
  192. NAME?    addr -- addr b
  193.     Returns True if the passed-in addr appears to be a cfa with a corresponding 
  194.     valid name field.  
  195. OBJ?    obj? -- obj? class  |  -- ^obj? 0
  196.     General test for an object.  Not completely rigorous, so we shouldn't use 
  197.     it in a TRAV, but pretty good nevertheless.  If it is an object, the class 
  198.     is left in theClass.  We do assume the passed-in value may not be a legal 
  199.     address at all.  
  200. OBJCFA?    cfa -- cfa b
  201.     Returns true if the cfa refers to a dictionary object.  Note: this won't 
  202.     work for a heap object, since we rely on the unique handler code for 
  203.     objects being there, and it won't be for heap objects.  But this is the 
  204.     only way to get a really rigorous check, which we need for TRAV.  We assume 
  205.     cfa is really a cfa.  
  206. HERE    -- addr    Returns the next available dictionary location.
  207. HIDE    --
  208.     Replace Smudge in Neon.  HIDE hides the last dictionary header so that FIND 
  209.     won't find it.  REVEAL brings it back again.  Use this if you want the 
  210.     previous use of the name, i.e.  if you DON'T want recursion.  
  211. L>NAME    ?    
  212. latest    -- nfa-1    A value. Leaves the nfa-1 of the last defined word.
  213. LINK>    ?    
  214. N>COUNT    nfa  -- addr len
  215.     Leaves the address and length of a name field, suitable for use by "type".
  216. N>LINK    ?    
  217. >BODY    ?    
  218. >CLASS    obj -- class | -- 0
  219.     Converts an object address to its class address.  Returns zero if the 
  220.     passed-in address isn't an object address.  Needs to work for heap as well 
  221.     as dictionary objects.  The test is very unlikely (maybe 1/2**24) to 
  222.     indicate a non-object as being an object.  Without tagged storage we can't 
  223.     be absolutely sure.  To save time we don't do a conservative check on ^obj 
  224.     actually being a legal address (unlike CFA?), apart from checking that it 
  225.     is even, which is a very quick check.  This means we may crash if an even 
  226.     but illegal address is passed in.  The presumption is that it really is an 
  227.     object address, and that anything else is an (unlikely) error.  
  228. >ClassCfa    obj -- class | -- 0
  229.     As for >CLASS, but if the class is exported from a module and you are 
  230.     executing in the main dictionary, it gives the cfa of the imported word, 
  231.     without accessing the module.  This can be useful if you just want to 
  232.     identify a class without needing all the class info.  If you are executing 
  233.     in the module, however, you will get the cfa of the class in the module.  
  234.     The general rule is that the returned cfa will always be the same as if you 
  235.     had just ticked the classname, wherever you are executing.  
  236. >HDLR    ?    
  237. >LINK    ?    
  238. >NAME    cfa -- nfa    Returns the name field address (nfa) for the given cfa.
  239. NAME>    ?    
  240. ENDTRAV?    -- b
  241.     A value.  May be set from within a trav handler to terminate the trav.
  242. fence    -- addr
  243.     A value. Leaves the address below which forget will not operate.
  244. FIND    str-addr -- cfa flag  |  -- F
  245.     Forth-83/ANSI standard.  As in Neon, calls the vectored uFind first, then 
  246.     simply returns if uFind returns a non-zero n.  In all cases, if the search 
  247.     succeeds, addr' is the cfa of the found dictionary entry, and n is -1 for a 
  248.     non-immediate word and 1 for an immediate word.  If the search fails, n is 
  249.     zero and addr' is the same as str-addr.  
  250. FORGET    -- : word
  251.     Deletes the word from the dictionary and ALL entries above it (i.e., in 
  252.     higher memory).  Issues message "in protected dictionary" if the word is 
  253.     below fence, and aborts.  
  254. DEFINED?    -- addr n  : word
  255.     Defined as  MWORD FIND.  Does a FIND on the next word in the input stream.
  256. DOES>    --
  257.     Defines the runtime action of a word defined with <builds.
  258. <BUILDS    --  :  name
  259.     We retain <BUILDS to be used in conjunction with DOES> rather than 
  260.     following the standard and using CREATE.  This is because CREATEd words 
  261.     have the data right at the cfa, while DOES> words have to have a pointer to 
  262.     the DOES> code.  So rather than waste space in CREATEd words or do a 
  263.     complicated kludge during compilation, we use <BUILDS.  
  264. DP    -- addr
  265.     A value.  Leaves the address of the next memory location above the 
  266.     dictionary.  
  267. CONTEXT    -- addr    
  268. CREATE    --  : name
  269.     This is now Forth-83/ANSI.  Creates a dictionary header using the next word 
  270.     in the input stream.  If this new word is executed, it returns its pfa.  
  271.     What we actually do is to call HEADER, then add in the appropriate handler 
  272.     code.  
  273. ALIGN-DP    --    If the DP is odd, adds one to it.
  274. ALLOT    n --
  275.     Reserves n additional bytes for the code field of the last defined 
  276.     dictionary entry.  
  277. CELLS    #cells -- #bytes
  278.     Given the number of cells, returns the number of bytes required (#bytes = 4 
  279.     x #cells).  
  280. CFA?    cfa? -- cfa? b    Checks if cfa? could really be a CFA.
  281. CLASS?    cfa? -- cfa? b    Returns true if the cfa refers to a class.
  282. 1CELL    ( -- 4 )    Compiler    Base
  283.     Not ANSI, but useful.  A constant which returms
  284.     the width of one cell.
  285.